package com.xhj.mybatis.reflection;

import com.xhj.mybatis.reflection.factory.DefaultObjectFactory;
import com.xhj.mybatis.reflection.factory.ObjectFactory;
import com.xhj.mybatis.reflection.wrapper.DefaultObjectWrapperFactory;
import com.xhj.mybatis.reflection.wrapper.ObjectWrapperFactory;

/**
 * SystemMetaObject
 *
 * @author XJks
 * @description SystemMetaObject 是一个工具类，提供了 MyBatis 反射相关的默认对象和方法
 */
public final class SystemMetaObject {

    /**
     * 默认的对象工厂，用于创建新对象实例
     */
    public static final ObjectFactory DEFAULT_OBJECT_FACTORY = new DefaultObjectFactory();

    /**
     * 默认的对象包装工厂，用于为对象提供包装（如动态代理等）
     */
    public static final ObjectWrapperFactory DEFAULT_OBJECT_WRAPPER_FACTORY = new DefaultObjectWrapperFactory();

    /**
     * 默认的反射器工厂，用于创建 Reflector 实例
     */
    public static final ReflectorFactory DEFAULT_REFLECTOR_FACTORY = ReflectorFactory.GLOBAL_INSTANCE;

    /**
     * 一个特殊的 MetaObject 实例，表示空对象，防止空指针异常
     */
    public static final MetaObject NULL_META_OBJECT = MetaObject.forObject(
            // 传入一个内部定义的空对象类
            NullObject.class,
            // 使用默认对象工厂
            DEFAULT_OBJECT_FACTORY,
            // 使用默认包装工厂
            DEFAULT_OBJECT_WRAPPER_FACTORY,
            // 使用默认反射工厂
            DEFAULT_REFLECTOR_FACTORY
    );

    /**
     * 私有构造方法，防止外部实例化该类（因为它只提供静态成员）
     */
    private SystemMetaObject() {
        // 防止实例化静态工具类
    }

    /**
     * 内部静态类，作为空对象的占位符
     */
    private static class NullObject {
    }

    /**
     * 静态方法，快速为任意对象创建 MetaObject 实例，使用默认工厂
     *
     * @param object 需要包装的对象
     * @return 对应的 MetaObject 实例
     */
    public static MetaObject forObject(Object object) {
        return MetaObject.forObject(
                // 需要包装的对象
                object,
                // 默认对象工厂
                DEFAULT_OBJECT_FACTORY,
                // 默认包装工厂
                DEFAULT_OBJECT_WRAPPER_FACTORY,
                // 默认反射工厂
                DEFAULT_REFLECTOR_FACTORY
        );
    }

}
